home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 2 / The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO / bbs / mfm_111b.zip / AREA.PAS < prev    next >
Pascal/Delphi Source File  |  1992-01-07  |  13KB  |  387 lines

  1. {========================================================================}
  2. Procedure GetAreaTable;
  3.   Var
  4.     AreaRecordNumber : Word;
  5.     MaxAreaRecord : ^AreaRecordType;
  6.   Begin
  7.     NumberOfAreaEntries := 0; AreaRecordNumber := 1;
  8.     If OpenMaxArea Then
  9.     Begin
  10.       MaxAreaRecord := RecordBuffer;
  11.       While GetMaxArea(AreaRecordNumber) = 0 Do
  12.       Begin
  13.         OkToAddToList := False;
  14.         Inc(AreaRecordNumber);
  15.         WorkString := Array2String(@MaxAreaRecord^.FilePath);
  16.         FindFirst(WorkString+'*.*',AnyFile,DirInfo);
  17.         If DosError = 0 Then
  18.         Begin
  19.           OkToAddToList := True;
  20.         End
  21.         Else
  22.         Begin
  23.           Assign(FileList,WorkString+'FILES.BBS');
  24.           {$I-} ReWrite(FileList); {$I+}
  25.           If IOresult = 0 Then
  26.           Begin
  27.             Close(FileList);
  28.             OkToAddToList := True;
  29.           End;
  30.         End;
  31.         If Length(WorkString) = 0 Then OkToAddToList := False;
  32.         If OkToAddToList Then
  33.         Begin
  34.           Inc(NumberOfAreaEntries);
  35.           If MaxAvail > SizeOf(ListRecord) Then
  36.           Begin
  37.             New(NewAreaEntry);
  38.             If NumberOfAreaEntries = 1 Then
  39.             Begin
  40.               FirstAreaEntry := NewAreaEntry;
  41.               NewAreaEntry^.PrevEntry := NIL;
  42.               OldAreaEntry := FirstAreaEntry;
  43.             End
  44.             Else
  45.             Begin
  46.               NewAreaEntry^.PrevEntry := OldAreaEntry;
  47.               OldAreaEntry^.NextEntry := NewAreaEntry;
  48.               OldAreaEntry := NewAreaEntry;
  49.             End;
  50.             NewAreaEntry^.AreaPath := WorkString;
  51.             NewAreaEntry^.Name := Array2String(@MaxAreaRecord^.Name);
  52.             NewAreaEntry^.Changed := False;
  53.           End;
  54.         End;
  55.       End;
  56.     End;
  57.     CloseMaxArea;
  58.     If NumberOfAreaEntries = 0 Then
  59.     Begin
  60.       WriteLn('No areas found!');
  61.       Halt(1);
  62.     End
  63.     Else
  64.     Begin
  65.       NewAreaEntry^.NextEntry := NIL;
  66.       AreaCounter := 1; ChooseAreaEntry := FirstAreaEntry;
  67.     End;
  68.   End;
  69. {========================================================================}
  70. Procedure DisplayArea(AreaNumber : Byte; TempAreaEntry : AreaPtr);
  71.   Var
  72.     Row, Col : Byte;
  73.   Begin
  74.     WorkString := TempAreaEntry^.AreaPath;
  75.     Delete(WorkString,Length(WorkString),1);
  76.     WorkString := RCopy(WorkString,1,RPos('\',WorkString)-1);
  77.     If AreaNumber = 1 Then Row := 1 Else Row := (((AreaNumber-1) Div Columns)+1);
  78.     If AreaNumber = 1 Then Col := 1 Else Col := (((AreaNumber-1) Mod Columns)*ColumnPos)+1;
  79.     If Col = 1 Then
  80.     Begin
  81.       AnsiGotoXY(Row,1); AnsiClearToEOL;
  82.     End;
  83.     AnsiGotoXY(Row,Col);
  84.     NewTextColor(LightRed);
  85.     Write(' '+WorkString);
  86.     NewTextColor(White);
  87.   End;
  88. {========================================================================}
  89. Procedure BlankAreaPointer(AreaNumber : Byte);
  90.   Var
  91.     Row, Col : Byte;
  92.   Begin
  93.     If AreaNumber = 1 Then Row := 1 Else Row := (((AreaNumber-1) Div Columns)+1);
  94.     If AreaNumber = 1 Then Col := 1 Else Col := (((AreaNumber-1) Mod Columns)*ColumnPos)+1;
  95.     AnsiGotoXY(Row,Col);
  96.     Write(' ');
  97.     AnsiGotoXY(24,80);
  98.   End;
  99. {========================================================================}
  100. Procedure ShowAreaPointer(AreaNumber : Byte);
  101.   Var
  102.     Row, Col : Byte;
  103.   Begin
  104.     AnsiGotoXY(25,1); AnsiClearToEol;
  105.     Write(ChooseAreaEntry^.AreaPath);
  106.     If AreaNumber = 1 Then Row := 1 Else Row := (((AreaNumber-1) Div Columns)+1);
  107.     If AreaNumber = 1 Then Col := 1 Else Col := (((AreaNumber-1) Mod Columns)*ColumnPos)+1;
  108.     AnsiGotoXY(Row,Col);
  109.     Write('>');
  110.     AnsiGotoXY(24,80);
  111.   End;
  112. {========================================================================}
  113. Procedure DisplayAreaList;
  114.   Var
  115.     AreaCounter : Byte;
  116.   Begin
  117.     OldAreaEntry := FirstAreaEntry; AreaCounter := 0;
  118.     While OldAreaEntry^.NextEntry <> NIL Do
  119.     Begin
  120.       Inc(AreaCounter);
  121.       DisplayArea(AreaCounter, OldAreaEntry);
  122.       OldAreaEntry := OldAreaEntry^.NextEntry;
  123.     End;
  124.     Inc(AreaCounter);
  125.     DisplayArea(AreaCounter, OldAreaEntry);
  126.   End;
  127. {========================================================================}
  128. Procedure AddTempArea;
  129.   Var
  130.     NewAreaName : String;
  131.   Begin
  132.     AnsiGotoXY(25,1); AnsiClearToEOL;
  133.     Write('Enter new temporary path: ');
  134.     NewAreaName := UpperString(EditLine('',40,25,26));
  135.     If Length(NewAreaName) > 0 Then
  136.     Begin
  137.       If Copy(NewAreaName,Length(NewAreaName),1) <> '\' Then NewAreaName := NewAreaName + '\';
  138.       OkToAddToList := False;
  139.       FindFirst(NewAreaName+'*.*',Archive,DirInfo);
  140.       If DosError = 0 Then
  141.       Begin
  142.         OkToAddToList := True;
  143.       End
  144.       Else
  145.       Begin
  146.         Assign(FileList,NewAreaName+'FILES.BBS');
  147.         {$I-} ReWrite(FileList); {$I+}
  148.         If IOresult = 0 Then
  149.         Begin
  150.           Close(FileList);
  151.           OkToAddToList := True;
  152.         End;
  153.       End;
  154.       If OkToAddToList Then
  155.       Begin
  156.         If MaxAvail > SizeOf(ListRecord) Then
  157.         Begin
  158.           New(NewAreaEntry);
  159.           NewAreaEntry^.PrevEntry := OldAreaEntry;
  160.           OldAreaEntry^.NextEntry := NewAreaEntry;
  161.           OldAreaEntry := NewAreaEntry;
  162.           NewAreaEntry^.AreaPath := NewAreaName;
  163.           NewAreaEntry^.NextEntry := NIL;
  164.           Inc(NumberOfAreaEntries);
  165.           DisplayAreaList;
  166.           ShowAreaPointer(AreaCounter);
  167.         End;
  168.       End
  169.       Else
  170.       Begin
  171.         AnsiGotoXY(25,1); AnsiClearToEOL;
  172.         Write('Directory '+NewAreaName+' not found!');
  173.       End;
  174.     End;
  175.   End;
  176. {========================================================================}
  177. Procedure MatchMask;
  178.   Var
  179.     AreaPointer : AreaPtr;
  180.     AreaPointerPosition : Byte;
  181.     Matched : Boolean;
  182.   Begin
  183.     Matched := False; AreaPointer := FirstAreaEntry; AreaPointerPosition := 1;
  184.     WorkString := AreaPointer^.AreaPath;
  185.     Delete(WorkString,Length(WorkString),1);
  186.     WorkString := RCopy(WorkString,1,RPos('\',WorkString)-1);
  187.     If Pos(AreaMask,UpperString(WorkString)) = 1 Then Matched := True;
  188.     While (AreaPointer^.NextEntry <> NIL) And (Not Matched) Do
  189.     Begin
  190.       AreaPointer := AreaPointer^.NextEntry; Inc(AreaPointerPosition);
  191.       WorkString := AreaPointer^.AreaPath;
  192.       Delete(WorkString,Length(WorkString),1);
  193.       WorkString := RCopy(WorkString,1,RPos('\',WorkString)-1);
  194.       If Pos(AreaMask,UpperString(WorkString)) = 1 Then Matched := True;
  195.     End;
  196.     If Matched Then
  197.     Begin
  198.       BlankAreaPointer(AreaCounter);
  199.       ChooseAreaEntry := AreaPointer;
  200.       AreaCounter := AreaPointerPosition;
  201.       ShowAreaPointer(AreaCounter);
  202.     End
  203.     Else
  204.     Begin
  205.       Delete(AreaMask,Length(AreaMask),1);
  206.     End;
  207.   End;
  208. {========================================================================}
  209. Function ChooseArea : String;
  210.   Var
  211.     Cax : Char;
  212.     Cab : Byte;
  213.   Begin
  214.     DisplayAreaList;
  215.     ShowAreaPointer(AreaCounter);
  216.     AreaMask := '';
  217.     Repeat
  218.       Gbx := GetInput;
  219.       Cax := Upcase(Chr(Gbx));
  220.       If Gbx = 0 Then
  221.       Begin
  222.         Gbx := GetInput;
  223.         Case Gbx Of
  224.           71 : Cax := '7';
  225.           72 : Cax := '8';
  226.           73 : Cax := '9';
  227.           75 : Cax := '4';
  228.           77 : Cax := '6';
  229.           79 : Cax := '1';
  230.           80 : Cax := '2';
  231.           81 : Cax := '3';
  232.         End;
  233.       End;
  234.       Case Cax Of
  235.         '1' : Begin
  236.                 BlankAreaPointer(AreaCounter);
  237.                 AreaCounter := (NumberOfAreaEntries - (NumberOfAreaEntries Mod Columns)) + 1;
  238.                 If AreaCounter > NumberOfAreaEntries Then AreaCounter := NumberOfAreaEntries - (Columns-1);
  239.                 ChooseAreaEntry := FirstAreaEntry;
  240.                 For Cab := 1 To AreaCounter-1 Do ChooseAreaEntry := ChooseAreaEntry^.NextEntry;
  241.                 ShowAreaPointer(AreaCounter);
  242.               End;
  243.         '2' : Begin
  244.                 If AreaCounter+Columns <= NumberOfAreaEntries Then
  245.                 Begin
  246.                   BlankAreaPointer(AreaCounter);
  247.                   AreaCounter := AreaCounter + Columns;
  248.                   For Cab := 1 To Columns Do ChooseAreaEntry := ChooseAreaEntry^.NextEntry;
  249.                   ShowAreaPointer(AreaCounter);
  250.                 End;
  251.               End;
  252.         '3' : Begin
  253.                 BlankAreaPointer(AreaCounter);
  254.                 AreaCounter := NumberOfAreaEntries - (NumberOfAreaEntries Mod Columns);
  255.                 ChooseAreaEntry := FirstAreaEntry;
  256.                 For Cab := 1 To AreaCounter-1 Do ChooseAreaEntry := ChooseAreaEntry^.NextEntry;
  257.                 ShowAreaPointer(AreaCounter);
  258.               End;
  259.         '4' : Begin
  260.                 If AreaCounter > 1 Then
  261.                 Begin
  262.                   ChooseAreaEntry := ChooseAreaEntry^.PrevEntry;
  263.                   BlankAreaPointer(AreaCounter);
  264.                   Dec(AreaCounter);
  265.                   ShowAreaPointer(AreaCounter);
  266.                 End;
  267.               End;
  268.         '6' : Begin
  269.                 If AreaCounter < NumberOfAreaEntries Then
  270.                 Begin
  271.                   ChooseAreaEntry := ChooseAreaEntry^.NextEntry;
  272.                   BlankAreaPointer(AreaCounter);
  273.                   Inc(AreaCounter);
  274.                   ShowAreaPointer(AreaCounter);
  275.                 End;
  276.               End;
  277.         '7' : Begin
  278.                 ChooseAreaEntry := FirstAreaEntry;
  279.                 BlankAreaPointer(AreaCounter);
  280.                 AreaCounter := 1;
  281.                 ShowAreaPointer(AreaCounter);
  282.               End;
  283.         '8' : Begin
  284.                 If AreaCounter-Columns > 0 Then
  285.                 Begin
  286.                   BlankAreaPointer(AreaCounter);
  287.                   AreaCounter := AreaCounter - Columns;
  288.                   For Cab := 1 To Columns Do ChooseAreaEntry := ChooseAreaEntry^.PrevEntry;
  289.                   ShowAreaPointer(AreaCounter);
  290.                 End;
  291.               End;
  292.         '9' : Begin
  293.                 BlankAreaPointer(AreaCounter);
  294.                 AreaCounter := Columns;
  295.                 ChooseAreaEntry := FirstAreaEntry;
  296.                 For Cab := 1 To Columns-1 Do ChooseAreaEntry := ChooseAreaEntry^.NextEntry;
  297.                 ShowAreaPointer(AreaCounter);
  298.               End;
  299.         ^I  : AddTempArea;
  300.         '?' : Begin
  301.                 AreaHelp;
  302.                 DisplayAreaList;
  303.                 ShowAreaPointer(AreaCounter);
  304.               End;
  305.       Else
  306.         If Cax = ^H Then
  307.         Begin
  308.           Delete(AreaMask,Length(AreaMask),1);
  309.           MatchMask
  310.         End;
  311.         If Cax In [':','A'..'Z','a'..'z'] Then
  312.         Begin
  313.           AreaMask := AreaMask + Cax;
  314.           MatchMask
  315.         End;
  316.         AnsiGotoXY(25,1); AnsiClearToEOL;
  317.         Write(AreaMask);
  318.       End;
  319.     Until Cax In [^M,^Q,^[];
  320.     If Cax In [^Q,^[] Then
  321.     Begin
  322.       If Cax = ^Q Then
  323.       Begin
  324.         ChooseArea := 'QUITQUICK';
  325.       End
  326.       Else
  327.       Begin
  328.         ChooseArea := 'QUIT';
  329.       End;
  330.     End
  331.     Else
  332.     Begin
  333.       ChooseArea := ChooseAreaEntry^.AreaPath;
  334.     End;
  335.   End;
  336. {========================================================================}
  337. Procedure ChooseNewArea;
  338.   Var
  339.     TempArea : String;
  340.   Begin
  341.     If Altered Then
  342.     Begin
  343.       SaveList;
  344.       Altered := False;
  345.     End;
  346.     BeginSort := NIL; EndSort := NIL;
  347.     NextPrintEntry := FirstEntry;
  348.     If NumberOfEntries > 0 Then
  349.     Begin
  350.       While NextPrintEntry^.NextEntry <> NIL Do
  351.       Begin
  352.         NextPrintEntry := NextPrintEntry^.NextEntry;
  353.         Dispose(NextPrintEntry^.PrevEntry);
  354.       End;
  355.       Dispose(NextPrintEntry);
  356.     End;
  357.     SetupScreen;
  358.     Repeat
  359.       TempArea := ChooseArea;
  360.       If TempArea = 'QUITQUICK' Then
  361.       Begin
  362.         Halt(1);
  363.       End;
  364.       If TempArea <> 'QUIT' Then
  365.       Begin
  366.         FileAreaPath := TempArea;
  367.       End;
  368.       NumberOfEntries := 0; BuildList;
  369.       If NumberOfEntries = 0 Then
  370.       Begin
  371.         AnsiGotoXY(25,1); AnsiClearToEOL;
  372.         Write('This area contains no files!');
  373.       End;
  374.     Until (NumberOfEntries > 0) Or (TempArea = 'QUIT');
  375.     If NumberOfEntries > 0 Then
  376.     Begin
  377.       If TempArea <> 'QUIT' Then
  378.       Begin
  379.         Row := 1;
  380.         CurrentEntry := FirstEntry;
  381.         TopEntry := FirstEntry;
  382.       End;
  383.       DisplayScreen;
  384.     End;
  385.   End;
  386. {========================================================================}
  387.